本文介绍了多租户资源隔离示例,您可以按照本文的内容自行测试,以快速了解和使用多租户资源隔离功能。
测试环境
使用的ECS实例和PolarDB MySQL版集群均位于同一地域和同一可用区。
网络类型均为VPC网络。
说明ECS实例和PolarDB MySQL版集群需保证在同一个VPC中。
使用的PolarDB MySQL版集群信息如下:
版本为PolarDB MySQL版8.0.2版本。
产品系列为集群版。
节点规格为polar.mysql.x4.xlarge(8核32 GB独享规格)
节点数量为2(一个主节点和一个只读节点)。
使用的连接串为集群地址。查看PolarDB MySQL版集群地址的具体步骤请参见查看连接地址和端口。
关键信息配置如下:
thread_pool_enable = ON thread_pool_size = 8 // 与PolarDB MySQL版集群规格中的核数保持一致 thread_pool_multi_tenant_enabled = ON enable_multi_tenant = ON
使用的ECS实例信息如下:
实例规格为ecs.g7.2xlarge。
实例使用的镜像为Ubuntu 22.04 64位。
测试流程
步骤一:创建资源配置信息
使用高权限账号连接数据库,并创建多种资源配置信息,用于对租户资源进行限制。
CREATE resource_config r1 min_cpu 0 max_cpu 1;
CREATE resource_config r2 min_cpu 0 max_cpu 2;
CREATE resource_config r3 min_cpu 0 max_cpu 4;
CREATE resource_config r4 min_cpu 0 max_cpu 8;
CREATE resource_config r5 min_cpu 1 max_cpu 2;
CREATE resource_config r6 min_cpu 2 max_cpu 4;
CREATE resource_config r7 min_cpu 4 max_cpu 8;
CREATE resource_config r8 min_cpu 6 max_cpu 8;
CREATE resource_config r9 min_cpu 7 max_cpu 8;
资源配置信息创建完成后,您可以通过查询mysql.tenant_resource_config
表来查看当前所有的配置资源。
SELECT * FROM mysql.tenant_resource_config;
步骤二:创建租户
使用高权限账号连接数据库,分别创建tenant_1
和tenant_2
两个租户,且在创建租户时与指定的资源配置信息绑定。
# 创建租户 tenant_1
CREATE tenant tenant_1 resource_config r1;
# 创建租户 tenant_2
CREATE tenant tenant_2 resource_config r5;
创建租户
tenant_1
时,将此租户与资源配置r1
绑定。此租户CPU资源限制min_cpu
为0,在后台资源调度时,将不保证此租户下使用CPU的最小限额。限制此租户使用CPU的最大额度为1 CPU。min_cpu=0
的租户称之为共享租户。创建租户
tenant_2
时,将此租户与资源配置r5
绑定,此租户CPU资源限制min_cpu
为1,在后台资源调度时,将保证此租户下使用CPU的最小限额为1 CPU,min_cpu >0
的租户为独享租户。
租户创建完成后,您可以通过查询mysql.tenants
表来查看当前的所有租户。
SELECT * FROM mysql.tenants;
在调度CPU资源时,通过调度分配给租户的线程组进行实现,您可以通过查询information_schema.thread_pool_status
表来查看租户使用的线程组情况。
SELECT * FROM information_schema.thread_pool_status;
执行结果如下:
从上图可以看出,ID为2的线程组被分配给tenant_2
,tenant_2
为独享租户,将会独占ID为2的线程组。而tenant_1
为共享租户,故不会独占任何一个线程组。
步骤三:创建用户和数据库
租户创建成功后,分别在两个租户下创建用户和数据库。
在租户tenant_1
下创建用户user_1
,并授予user_1
在tenant_1
租户下的所有执行权限。此处可以将user_1@tenant_1
当做租户tenant_1
下的一个高权限账号。
#在系统租户下创建'user_1@tenant_1'
CREATE user 'user_1@tenant_1' IDENTIFIED WITH mysql_native_password BY {pwssword};
#在高权限账户下,为user1@tenant_1授予租户tenant_1下的所有执行权限
#(需注意不要超出当前租户权限,不要授予其他租户的权限)
GRANT all privileges ON `%@tenant_1`.* to 'user_1@tenant_1'@'%' with grant option;
#在高权限账户下,为user1@tenant_1授予CREATE USER权限
GRANT CREATE user ON *.* to 'user_1@tenant_1'@'%';
用户创建成功后,通过该用户连接数据库的SQL语句如下:
mysql --host=xxxxxx -u user1@tenant_1 -p pwssword
使用该账号登录数据库成功后,您仅可查看当前租户下的数据库。对于系统租户下的数据库以及其他租户下的数据库该账号均不可见。
继续在当前连接中创建用户user_2
以及数据库sbtest
。
# 创建user_2
CREATE user 'user_2' IDENTIFIED WITH mysql_native_password BY {pwssword};
# 授予user_2权限
GRANT CREATE,INSERT,SELECT,UPDATE,DELETE,DROP,index ON *.* to user_2;
# 创建sbtest
CREATE database sbtest;
在租户tenant_1
下创建用户以及数据库后,您可以通过相同的方式在tenant_2
下创建用户和数据库。
步骤四:进行资源隔离测试
Sysbench数据准备
sysbench oltp_read_only --threads=512 --mysql-host=xxxx --mysql-user=user_2@tenant_1 --mysql-password={password} --mysql-db=sbtest --tables=10 --table-size=50000 --report-interval=1 --time=7200 prepare
执行Sysbench测试
sysbench oltp_read_only --threads=512 --mysql-host=xxxx --mysql-user=user_2@tenant_1 --mysql-password={password} --mysql-db=sbtest --tables=10 --table-size=50000 --report-interval=1 --time=7200 run
在执行Sysbench测试期间,您需要使用高权限账号user_1
按照资源配置顺序切换tenant_1
所对应的资源配置信息。调整资源配置信息的ALTER语法如下:
ALTER tenant tenant_1 resource_config r7;
资源配置切换测试一
该测试将使用租户tenant_1
下的user_2
来进行Sysbench测试,通过切换tenant_1
绑定的资源配置信息来观察集群使用的CPU资源变化情况。此时tenant_2
的资源配置信息为r5
。tenant_1
绑定的资源配置信息切换顺序为r1->r4->r5->r6->r7->r3->r2->r1。
测试结果
读写(RW)节点的测试数据如下:
CPU/内存利用率
TPS/QPS
只读(RO)节点的测试数据如下:
CPU/内存利用率
TPS/QPS
在该测试中,因为tenant_2
的资源配置信息为r5
,在对tenant_1
执行测试时,所能达到的最高CPU为7,CPU占比约为CPU总量的87%。根据tenant_1
所绑定资源配置的变化,读写节点和只读节点的CPU使用率与QPS均发生相应的变化。
资源配置切换测试二
该测试将tenant_2
的resource_config
修改为r7
,后续的测试过程中不再修改tenant_2
的资源信息。仅调整tenant_1
绑定的资源配置信息,资源配置信息的切换顺序为r1->r4->r5->r6->r3->r2->r1。
测试结果
读写(RW)节点的测试数据如下:
CPU/内存利用率
TPS/QPS
只读(RO)节点的测试数据如下:
CPU/内存利用率
TPS/QPS
在该测试中,由于租户tenant_2
的resource_config
配置为r7
,在对租户tenant_1
执行测试时,所能达到的最高CPU为4,CPU占比约为CPU总量的50%。根据tenant_1
绑定的资源配置信息变化,读写节点和只读节点的CPU使用率与QPS均发生相应的变化。